package com.itsxb.template;

import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.itsxb.dto.OpenidResultDto;
import com.itsxb.properties.WechatProperties;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.Assert;

public class WechatTemplate {



    private WechatProperties wechatProperties;

    public WechatTemplate(WechatProperties wechatProperties){
        this.wechatProperties = wechatProperties;
    }

    /**
     * 根据code获取openid
     * @return
     */
    public String code2OpenId(String openidCode){
        //从application.yml中获取这三个参数appid，secret前端传过来的loginCode得到url,
        String url = String.format(wechatProperties.getOpenidUrlTemplate(), wechatProperties.getAppid(), wechatProperties.getAppsecret(), openidCode);
        //执行请求
        String s = HttpUtil.get(url);
        //2.1业务校验
        //通过断言来判断s.contains("errCode")为false，不为false就抛出异常 断言是真再取反 就变成了
        Assert.isTrue(!s.contains("errCode"),"获取openId失败");
        //将JSON字符串转换成指定对象类型
        OpenidResultDto openidResultDto = JSONObject.parseObject(s, OpenidResultDto.class);
        //获取openid
        return openidResultDto.getOpenid();
    }


    //方法用来获取手机号
    public String code2Phone(String phoneCode) {
        String phoneNumber;
        if (phoneCode.equals("调用微信API")){
            phoneNumber  = "15128263468";
        }else{
            //将需要的参数传递到url中
            String tokenUrl = String.format(wechatProperties.getTokenUrlTemplate(), wechatProperties.getAppid(), wechatProperties.getAppsecret());
            //后端发送http的get请求，得到JSON对象，这里获得的是access_token，因为获得phone需要access_token参数
            String accessTokenJson = HttpUtil.get(tokenUrl);
            //判断是否有错误
            Assert.isTrue(!accessTokenJson.contains("errCode"),"获取accessToken失败！");
            //将得到的结果，以JSONObject的格式接收
            JSONObject jsonObject = JSONObject.parseObject(accessTokenJson);
            //通过key获取access_token的值
            String accessToken = jsonObject.getString("access_token");
            //将参数传递到获取手机号的url中
            String phoneJson = String.format(wechatProperties.getPhoneUrlTemplate(), accessToken);
            //得到结果，以json的格式接收
            JSONObject phoneCodeJson = JSONObject.parseObject(phoneCode);
            //后端发送http的post请求
            String phonePost = HttpUtil.post(phoneJson, phoneCodeJson);
            //判断请求是否得到数据
            Assert.isTrue(!phonePost.contains("errCode"),"获取手机号失败！");
            //以Json的格式接收参数
            JSONObject phoneFirstJson = JSONObject.parseObject(phonePost);
            //但是phone的结果在这个对象中的对象，所以还需要通过key来获取这个对象
            String phoneSecond = phoneFirstJson.getString("phone_info");
            //通过key得到对象
            JSONObject phoneNumberJson = JSONObject.parseObject(phoneSecond);
            //对象中，通过key得到手机号
            phoneNumber = phoneNumberJson.getString("phoneNumber");

        }
        return phoneNumber;
    }



}
